package com.shujia.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo03Map {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf()

    conf.setAppName("Demo03Map")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[String] = sc.textFile("spark/data/stu/students.txt")

    /**
     * 在Spark中所有的算子可以分为两类：
     *  Transformation算子（转换算子）：由一个RDD变成另一个RDD，RDD之间的转换
     *  Action算子（行为算子）：可以触发一个Spark的Job，一个Action算子对应一个Job
     *
     *  转换算子（懒执行）并不会自己执行，需要行为算子进行触发执行
     */


    /**
     * Map操作：同List类似，传入一条数据返回一条数据
     * 需要接收一个函数f：同RDD中每条数据的类型一致 => 由用户自己定义
     */


    val stuList: List[String] = List[String]("1500100001,施笑槐,22,女,文科六班", "1500100002,吕金鹏,24,男,文科六班")

    stuList.map(line => {
      println("进入了List中的map方法")
      val splits: Array[String] = line.split(",")
      (splits(1), splits(4))
    })

    // 取出name以及班级
    val nameAndClazzRDD: RDD[(String, String)] = stuRDD.map(line => {
      println("进入了RDD中的map方法")
      val splits: Array[String] = line.split(",")
      (splits(1), splits(4))
    })

    /**
     * foreach算子：行为算子，可以触发一个Spark的Job
     * 同map算子类似，区别在于map算子有返回值，foreach算子没有返回值
     */
    nameAndClazzRDD.foreach(println)

    while (true){

    }


  }

}
